package cn.itsource.service.impl;

import cn.itsource.dto.SmsDto;
import cn.itsource.exception.MyException;
import cn.itsource.result.JSONResult;
import cn.itsource.service.IVerifycodeService;
import cn.itsource.utils.MyTools;
import com.wf.captcha.SpecCaptcha;
import com.wf.captcha.base.Captcha;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

/**
 * @Author: Jason
 * @Date: 2022/9/7 17:19
 */
@Service
public class VerifycodeServiceImpl implements IVerifycodeService {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 1. 新建接口
     * 2. 生成随机4位数，并存储Redis
     * 3. 将4位数水印到图片上
     * 4. 图片转成Base64数据
     *
     * @param uuid
     * @return
     */
    @Override
    public JSONResult imageCode(String uuid) {
        SpecCaptcha specCaptcha = new SpecCaptcha(130,35,4);
        //设置验证码的类型（可不设置，使用默认值）
        specCaptcha.setCharType(Captcha.TYPE_ONLY_CHAR);
        //获取图片验证码
        String s = specCaptcha.text().toLowerCase();
        //存入redis
        redisTemplate.opsForValue().set(uuid,s,2, TimeUnit.MILLISECONDS);

        return JSONResult.success(specCaptcha.toBase64());
    }
    /**
     * 1. 获取用户输入的图片验证码、手机号、UUID
     * 2. 入参校验
     * 3. 根据UUID如Redis查询，结果和前端传来的验证码对比
     * 4. 校验手机号是否已存在与数据库中
     * 5. 发送短信验证码（6位数字），6位数字需要存入Redis，key=手机号
     * @param dto
     * @return
     */
    @Override
    public JSONResult sendSmsCode(SmsDto dto) {
        //获取redis中的验证码
        String o = (String)redisTemplate.opsForValue().get(dto.getImageCodeKey());
        if (StringUtils.isEmpty(o)){
            throw new MyException("验证码已过期,请点击图片重新获取验证码");
        }
        if (!o.equals(dto.getImageCode())){
            throw new MyException("验证码输入有误,请重新输入验证码");
        }
        //判断手机号是否已经注册
        String randomNum = MyTools.getRandomNum(6);
        String msg = "尊敬的XX用户，验证码为：" + randomNum;
        System.out.println("收到短信了=" + msg);

        //验证码存Redis
        redisTemplate.opsForValue().set(dto.getMobile(), randomNum, 3, TimeUnit.MINUTES);

        return JSONResult.success();
    }


}
